package service

import (
	"strconv"
	"sugar/controller"
	"sugar/errorcode"
	"sugar/utils"

	"github.com/gin-gonic/gin"
	"gopkg.in/guregu/null.v3"
)

// type createTrainJobParams struct {
// 	Name           null.String `json:"name"`
// 	Version        null.Int    `json:"version"`
// 	ProjectID      null.Int    `json:"project_id"`
// 	Description    null.String `json:"description"`
// 	Budget         null.String `json:"budget"`
// 	TrainDatasetID null.Int    `json:"train_dataset_id"`
// 	ValDatasetID   null.Int    `json:"val_dataset_id"`
// 	ModelID        null.Int    `json:"model_id"`
// 	ModelCommitID  null.String `json:"model_commit_id"`
// 	ModelArgs      null.String `json:"model_args"`
// 	TrainArgs      null.String `json:"train_args"`
// 	UseAutoml      int         `json:"use_automl"`
// 	DestScore      string      `json:"dest_score"`
// 	MaxTrials      int         `json:"maxtrials"`
// }

type getAppParams struct {
	ID null.Int `json:"id"`
}

type updateAppStatusParams struct {
	ReadyReplicas int32  `json:"readyreplicas"`
	Replicas      int32  `json:"replicas"`
	Status        string `json:"status"`
}

// @Summary 停止应用
// @Description 停止应用
// @Tags 应用管理
// @Accept  json
// @Produce json
// @Param   params     body    getAppParams     true        "应用ID"
// @Success 200 {object}  response.Response	"Success data为null"
// @Failure 500  {object}  response.Response  "内部错误 data为null"
// @Failure 401  {object}  response.Response  "token错误 data为null"
// @Failure 404  {object}  response.Response  "无法访问 data为null"
// @Router /app/stop [post]
func stopApp(c *gin.Context, tokenMap map[string]interface{}) {
	paramOk := utils.CheckUUID4MustExist(tokenMap["user_id"])
	if !paramOk {
		panic(errorcode.ParamError)
	}
	var jsonParams getAppParams
	err := c.BindJSON(&jsonParams)
	if err != nil {
		panic(errorcode.ParamError)
	}
	paramOk = utils.CheckIntMustExist(jsonParams.ID)
	if !paramOk {
		panic(errorcode.ParamError)
	}
	appOp := controller.NewOp()
	res := appOp.StopApp(tokenMap["user_id"].(string), jsonParams.ID.Int64)
	c.JSON(res.StatusCode, res)
}

// @Summary 获取应用详情
// @Description 获取应用详情
// @Tags 应用管理
// @Accept  json
// @Produce json
// @Param   params     body    getAppParams     true        "应用ID"
// @Success 200 {object}  response.Response	"Success data为null"
// @Failure 500  {object}  response.Response  "内部错误 data为null"
// @Failure 401  {object}  response.Response  "token错误 data为null"
// @Failure 404  {object}  response.Response  "无法访问 data为null"
// @Router /app [get]
func getApp(c *gin.Context, tokenMap map[string]interface{}) {
	paramOk := utils.CheckUUID4MustExist(tokenMap["user_id"])
	if !paramOk {
		panic(errorcode.ParamError)
	}
	var jsonParams getAppParams
	err := c.BindQuery(&jsonParams)
	if err != nil {
		panic(errorcode.ParamError)
	}
	paramOk = utils.CheckIntMustExist(jsonParams.ID)
	if !paramOk {
		panic(errorcode.ParamError)
	}
	appOp := controller.NewOp()
	res := appOp.GetApp(tokenMap["user_id"].(string), jsonParams.ID.Int64)
	c.JSON(res.StatusCode, res)
}

// @Summary 获取应用列表
// @Description 获取应用列表
// @Tags 应用管理
// @Accept  json
// @Produce json
// @Success 200 {object}  response.Response	"Success data为null"
// @Failure 500  {object}  response.Response  "内部错误 data为null"
// @Failure 401  {object}  response.Response  "token错误 data为null"
// @Failure 404  {object}  response.Response  "无法访问 data为null"
// @Router /app/list [get]
func listApp(c *gin.Context, tokenMap map[string]interface{}) {
	paramOk := utils.CheckUUID4MustExist(tokenMap["user_id"])
	if !paramOk {
		panic(errorcode.ParamError)
	}
	appOp := controller.NewOp()
	res := appOp.ListApp(tokenMap["user_id"].(string))
	c.JSON(res.StatusCode, res)
}

// @Summary 更新应用状态
// @Description 更新应用状态
// @Tags 应用管理
// @Accept  json
// @Produce json
// @Param   params     body    updateAppStatusParams     true        "应用状态"
// @Success 200 {object}  response.Response	"Success data为null"
// @Failure 500  {object}  response.Response  "内部错误 data为null"
// @Failure 401  {object}  response.Response  "token错误 data为null"
// @Failure 404  {object}  response.Response  "无法访问 data为null"
// @Router /app/status/:id [post]
func updateAppStatus(c *gin.Context) {
	// paramOk := utils.CheckUUID4MustExist(tokenMap["user_id"])
	// if !paramOk {
	// 	panic(errorcode.ParamError)
	// }
	var jsonParams updateAppStatusParams
	err := c.BindJSON(&jsonParams)
	if err != nil {
		panic(errorcode.ParamError)
	}
	paramOk := utils.CheckStringMustExist(jsonParams.Status)
	if !paramOk {
		panic(errorcode.ParamError)
	}
	id, bexist := c.Params.Get("id")
	if !bexist {
		panic(errorcode.ParamError)
	}
	nid, _ := strconv.Atoi(id)
	appOp := controller.NewOp()
	res := appOp.UpdateAppStatus(int64(nid), jsonParams.Status)
	c.JSON(res.StatusCode, res)
}
